#ifndef _CHATSERVICE_H_
#define _CHATSERVICE_H_
#include <mutex>
#include <muduo/net/TcpConnection.h>
#include <unordered_map>
#include <functional>
using namespace std;
using namespace muduo;
using namespace muduo::net;
#include "jsonhead.h"
#include "public.hpp"
#include "usrmodel.hpp"
#include "offmsgmdl.hpp"
#include "friendmodel.hpp"
#include "groupmodel.hpp"
#include "redis.hpp"

// 处理消息的事件回调方法类型
using MsgHandler = std::function<void(const TcpConnectionPtr &conn, Json::Value &js, Timestamp timestamp)>;

// 聊天服务器业务类
/*
    这个类主要提供了不同消息种类的不同处理方法
*/
class Chatservice
{
public:
    // 单例模式获取
    static Chatservice *instance();

    void login(const TcpConnectionPtr &conn, Json::Value &js, Timestamp time);

    // 处理注册业务
    void reg(const TcpConnectionPtr &conn, Json::Value &js, Timestamp time);

    MsgHandler getHandler(int msgid);

    //客户端异常退出代码
    void clientCloseException(const TcpConnectionPtr &conn);


    //一对一聊天接口
    void oneChat(const TcpConnectionPtr &conn, Json::Value &js, Timestamp time);

    //服务器异常终止后，重置user的state信息
    void reset();
    

    void addfriend(const TcpConnectionPtr &conn, Json::Value &js, Timestamp time);

    void createGroup(const TcpConnectionPtr &conn, Json::Value &js, Timestamp time);

    void showGroup(const TcpConnectionPtr &conn, Json::Value &js, Timestamp time);

    void addGroup(const TcpConnectionPtr &conn, Json::Value &js, Timestamp time);

    void showfriends(const TcpConnectionPtr &conn, Json::Value &js, Timestamp time);

    void leavemessage(const TcpConnectionPtr &conn, Json::Value &js, Timestamp time);

    void groupchat(const TcpConnectionPtr &conn, Json::Value &js, Timestamp time);

    void loginout(const TcpConnectionPtr &conn, Json::Value &js, Timestamp time);

    void handleRedisSubscribeMessage(int userid, string msg);
private:
    // 构造函数，注册各种信息的回调方法
    Chatservice();
    // 存储消息id和其对应的业务处理方法
    unordered_map<int, MsgHandler> _msgHandlerMap;

    // 互斥锁,保证_userConnMap的线程安全
    mutex _connmutex;
    static Chatservice *_instance;
    // 存储在线用户的通信连接
    unordered_map<int, TcpConnectionPtr> _userConnMap;
    // 数据库操作对象
    UsrModel _usrmodel; // 服务器操作数据库user表都通过该类
    offmsgmdl _offmsgmdl;   //操作数据库offlinemessage表
    Friendmodel _friendmdl; //操作数据库frinedmdl表
    groupmodel _groupmodel; //操作allrgoup和groupuser表
    Redis _redismodel;  //操作Redis的模块
};
#endif